Les 11 variables: “Km” (kilométrage du véhicule), “Marque” (marque du véhicule), “Modèle” (modèle du véhicule), “Sous-modèle” (varient selon les options), “Type” (de carrosserie), “Cylindré” (moteur), “Litre” (mesure plus précise de la taille du moteur), “Portes” (Nombre de portes), “Régulateur”, “HP” (haut-parleurs Dolby stéréo), “Cuir” (intérieur cuir).

Les Marques, “Buick” , “Cadillac” , “Chevrolet” , “Pontiac” , “Saturn”, sont de fabrication americaine. La marque “SAAB” est de fabrication suedoise.

1- Le DataFrame

1-1 Affichage des 7 premieres lignes du DataFrame

head(Base_Projet_Introduction_Modelisation_2024,7)

1-2 Informations tirees du DataFrame

# La dimension du DataFrame (804 voitures et 12 variables)
dim(Base_Projet_Introduction_Modelisation_2024)
[1] 804  12
# Les Marques de voitures et leurs frequences
frequence_marque <- table(Base_Projet_Introduction_Modelisation_2024$Marque)
print(frequence_marque)

    Buick  Cadillac Chevrolet   Pontiac      SAAB    Saturn 
       80        80       320       150       114        60 
# Compte des Modèles de voitures et leurs frequences
frequence_modele <- table(Base_Projet_Introduction_Modelisation_2024$Modèle)
print(frequence_modele)

   9-2X AWD         9_3      9_3 HO         9_5      9_5 HO 
          4          20          40          30          20 
       AVEO  Bonneville    Cavalier     Century     Classic 
         60          30          60          10          10 
     Cobalt    Corvette       CST-V         CTS     Deville 
         50          20          10          10          30 
         G6    Grand Am  Grand Prix         GTO      Impala 
         20          20          30          10          30 
        Ion    L Series    Lacrosse     Lesabre      Malibu 
         50          10          30          20          60 
Monte Carlo Park Avenue      STS-V6      STS-V8     Sunfire 
         30          20          10          10          10 
       Vibe      XLR-V8 
         30          10 

# `Valeure minimale d'une voiture = 5.182.840  F CFA`
# `Valeure maximale d'une voiture = 42.449.034 F CFA`

prix_minimal <- min(Base_Projet_Introduction_Modelisation_2024$Prix)
prix_maximal <- max(Base_Projet_Introduction_Modelisation_2024$Prix)



print(paste("Le prix minimal en $ d'une voiture de marque americaine est egal a:", prix_minimal, ", "  ,"soit:", 599.94 * prix_minimal, "F CFA"))
[1] "Le prix minimal en $ d'une voiture de marque americaine est egal a: 8638.93089526066 ,  soit: 5182840.20130268 F CFA"
print(paste("Le prix maximal en $ d'une voiture de marque americaine est egal a:", prix_maximal, ", "  ,"soit:", 599.94 * prix_maximal, "F CFA"))
[1] "Le prix maximal en $ d'une voiture de marque americaine est egal a: 70755.4667165429 ,  soit: 42449034.7019227 F CFA"

2- Identification des 3 variables les plus corrélées à la variable dépendante Prix.

2-1 - Seperation des variables numeriques num_vars des variables categorielles cat_vars


num_vars <- Base_Projet_Introduction_Modelisation_2024[, sapply(Base_Projet_Introduction_Modelisation_2024, is.numeric)]

cat_vars <- Base_Projet_Introduction_Modelisation_2024[, sapply(Base_Projet_Introduction_Modelisation_2024, is.factor) | sapply(df, is.character)]

2-2 Afichage de la base de donnees des variables numeriques num_vars

head(num_vars,7)

2-3 Correlation entre les variables numeriques num_vars

correlations <- cor(num_vars)
correlations
                 Prix           Km   Cylindrée       Litre
Prix        1.0000000 -0.143050506  0.56908614  0.55814581
Km         -0.1430505  1.000000000 -0.02946099 -0.01864062
Cylindrée   0.5690861 -0.029460989  1.00000000  0.95789658
Litre       0.5581458 -0.018640622  0.95789658  1.00000000
Portes     -0.1387497 -0.016944490  0.00220592 -0.07925909
Régulateur  0.4308515  0.025036652  0.35428485  0.37750927
HP         -0.1243478 -0.026145926 -0.08970430 -0.06552707
Cuir        0.1571969  0.001005446  0.07551962  0.08733194
                Portes  Régulateur          HP         Cuir
Prix       -0.13874965  0.43085149 -0.12434785  0.157196855
Km         -0.01694449  0.02503665 -0.02614593  0.001005446
Cylindrée   0.00220592  0.35428485 -0.08970430  0.075519616
Litre      -0.07925909  0.37750927 -0.06552707  0.087331945
Portes      1.00000000 -0.04767418 -0.06253031 -0.061968579
Régulateur -0.04767418  1.00000000 -0.09173015 -0.070573094
HP         -0.06253031 -0.09173015  1.00000000  0.165443625
Cuir       -0.06196858 -0.07057309  0.16544362  1.000000000
# Heatmap Correlation entre les variables numeriques `num_vars`

library(corrplot)
Avis : le package ‘corrplot’ a été compilé avec la version R 4.3.3
corrplot 0.92 loaded
corrplot(correlations, method = "color", type = "upper", 
         tl.col = "black", tl.srt = 45,
         col = colorRampPalette(c("blue", "white", "red"))(200))

2-4 Extraction de la variable dependante Prix

dependante_var <- "Prix"
dependante_var
[1] "Prix"

2-5 Extraction des corrélations avec la variable dépendante Prix

cor_avec_prix <- correlations[, dependante_var]
cor_avec_prix
      Prix         Km  Cylindrée      Litre     Portes Régulateur 
 1.0000000 -0.1430505  0.5690861  0.5581458 -0.1387497  0.4308515 
        HP       Cuir 
-0.1243478  0.1571969 

2-7 Tri par ordre des corrélations avec la variable dépendante Prix

tri_correlations <- sort(abs(cor_avec_prix), decreasing = TRUE)
tri_correlations
      Prix  Cylindrée      Litre Régulateur       Cuir         Km 
 1.0000000  0.5690861  0.5581458  0.4308515  0.1571969  0.1430505 
    Portes         HP 
 0.1387497  0.1243478 

Interpretation :

Les 3 variables les plus corrélées à la variable dépendante Prix sont Cylindrée, Litre et Régulateur

3 - Mise en place de 3 modèles de régression linéaire simple et Comparaisons des modèles

3-1 Ajustement du modèle de régression linéaire Prix, Cylindrée: le model1


model1 <- lm(Prix ~ Cylindrée, data = num_vars)
summary(model1)

Call:
lm(formula = Prix ~ Cylindrée, data = num_vars)

Residuals:
   Min     1Q Median     3Q    Max 
-11216  -5230  -2749   2773  38339 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   -17.06    1126.94  -0.015    0.988    
Cylindrée    4054.20     206.85  19.600   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 8133 on 802 degrees of freedom
Multiple R-squared:  0.3239,    Adjusted R-squared:  0.323 
F-statistic: 384.1 on 1 and 802 DF,  p-value: < 2.2e-16
library(ggplot2)
Avis : le package ‘ggplot2’ a été compilé avec la version R 4.3.3
Use suppressPackageStartupMessages() to eliminate package
startup messages
library(plotly)
Avis : le package ‘plotly’ a été compilé avec la version R 4.3.3
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attachement du package : ‘plotly’

L'objet suivant est masqué depuis ‘package:ggplot2’:

    last_plot

L'objet suivant est masqué depuis ‘package:stats’:

    filter

L'objet suivant est masqué depuis ‘package:graphics’:

    layout
p <- ggplot(num_vars, aes(x = Prix, y = Cylindrée)) +
  geom_point(color = 'blue') + 
  geom_smooth(method = "lm", se = FALSE, color = 'red') + 
  labs(title = "Régression linéaire entre Prix et Cylindrée", x = "Prix", y = "Cylindrée")


p_interactif1 <- ggplotly(p)
`geom_smooth()` using formula = 'y ~ x'
p_interactif1
NA

3-2 Ajustement du modèle de régression linéaire Prix, Litre: le model2

model2 <- lm(Prix ~ Litre, data = num_vars)
summary(model2)

Call:
lm(formula = Prix ~ Litre, data = num_vars)

Residuals:
   Min     1Q Median     3Q    Max 
-10186  -5128  -3172   3032  41614 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   6185.8      846.7   7.306 6.66e-13 ***
Litre         4990.4      262.0  19.050  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 8207 on 802 degrees of freedom
Multiple R-squared:  0.3115,    Adjusted R-squared:  0.3107 
F-statistic: 362.9 on 1 and 802 DF,  p-value: < 2.2e-16


p <- ggplot(num_vars, aes(x = Prix, y = Litre)) +
  geom_point(color = 'blue') + 
  geom_smooth(method = "lm", se = FALSE, color = 'red') + 
  labs(title = "Régression linéaire entre Prix et Litre", x = "Prix", y = "Litre")


p_interactif2 <- ggplotly(p)
`geom_smooth()` using formula = 'y ~ x'
p_interactif2

3-3 Ajustement du modèle de régression linéaire Prix, Régulateur: le model3

model3 <- lm(Prix ~ Régulateur, data = num_vars)
summary(model3)

Call:
lm(formula = Prix ~ Régulateur, data = num_vars)

Residuals:
   Min     1Q Median     3Q    Max 
-14913  -6020  -1454   3634  46971 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  13921.9      632.7   22.00   <2e-16 ***
Régulateur    9862.3      729.4   13.52   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 8926 on 802 degrees of freedom
Multiple R-squared:  0.1856,    Adjusted R-squared:  0.1846 
F-statistic: 182.8 on 1 and 802 DF,  p-value: < 2.2e-16
library(ggplot2)
library(plotly)


p <- ggplot(num_vars, aes(x = Prix, y = Régulateur)) +
  geom_point(color = 'blue') + 
  geom_smooth(method = "lm", se = FALSE, color = 'red') + 
  labs(title = "Régression linéaire entre Prix et Régulateur", x = "Prix", y = "Régulateur")


p_interactif3 <- ggplotly(p)
`geom_smooth()` using formula = 'y ~ x'
p_interactif3

3-4 Comparaison des 3 models( model1, model2, model3)

3-4-1 Comparaison des R-squared (R²) , Adjusted R-squared , AIC , BIC , Coefficients , p-value

# Extraction des informations importantes pour la comparaison

models <- list(model1, model2, model3)
noms_models <- c("Model1 (Prix ~ Cylindrée)", "Model2 (Prix ~ Litre)", "Model3 (Prix ~ Régulateur)")

resultats_compares <- data.frame(
  Model = noms_models,
  R_squared = sapply(models, function(model) summary(model)$r.squared),
  Adjusted_R_squared = sapply(models, function(model) summary(model)$adj.r.squared),
  AIC = sapply(models, AIC),
  BIC = sapply(models, BIC),
  p_value = sapply(models, function(model) anova(model)$`Pr(>F)`[1])
)

print(resultats_compares)
NA

Interpretation:

  • Le R_Squared : La proportion de la variance totale des données qui est expliquée par le modèle1 est plus eleve que ceux des 2 autres models. Plus le R-squared est élevé, meilleur est l’ajustement du modèle aux données. Donc le model1 est le meilleur model si nous nous basons uniquement sur le R_Squared.

  • Adjusted_R_squared : La valeure de l’Adjusted R-squared du model1 indique un meilleur ajustement du modèle aux données car etant plus eleve. Donc le model1 est le meilleur model si nous nous basons uniquement sur l’Adjusted_R_squared.

  • Le model1 a la plus petite valeur d’AIC (Akaike Information Criterion) donc il est le meilleur model.

  • Le BIC (Bayesian Information Criteria) du model1 est plus bas que celui des 2 autres donc nous choisisons le model1.

  • Le model1 a un variable prédictive Cylindrée ayant un p-value significativement faible et est considéré comme le meilleur car il indique une meilleure adéquation du variable Cylindrée utilisée pour expliquer la variable Prix

3-4-2 Visualisation des residus

# Le Trace les résidus vs les valeurs ajustées pour chaque modèle

par(mfrow = c(1, 3))  # Disposition des graphiques en une ligne et trois colonnes

plot(model1$fitted.values, model1$residuals, main = "Model1 (Prix ~ Cylindrée)",
     xlab = "Valeurs ajustées", ylab = "Résidus")
abline(h = 0, col = "red")

plot(model2$fitted.values, model2$residuals, main = "Model2 (Prix ~ Litre)",
     xlab = "Valeurs ajustées", ylab = "Résidus")
abline(h = 0, col = "red")

plot(model3$fitted.values, model3$residuals, main = "Model3 (Prix ~ Régulateur)",
     xlab = "Valeurs ajustées", ylab = "Résidus")
abline(h = 0, col = "red")

Interpretation :

  • le Model2 a une répartition uniforme et aléatoire des résidus autour de la ligne zéro (ligne rouge). Une distribution uniforme du model2 suggère que les erreurs de prédiction sont réparties de manière équitable sur l’ensemble des donnees num_vars.

4 - Analyse multivariée pour décrire le processus d’attribution du Prix d’un véhicule en fonction des caractéristiques quantitatives.

4-1 Régression linéaire multiple (Interpretation du model)

4-1-1 Analyse du summary du model de regression multiple

model_reg_multiple <- lm(Prix ~ Km + Cylindrée + Litre + Portes + Régulateur + HP + Cuir, data = num_vars)

summary(model_reg_multiple)

Call:
lm(formula = Prix ~ Km + Cylindrée + Litre + Portes + Régulateur + 
    HP + Cuir, data = num_vars)

Residuals:
   Min     1Q Median     3Q    Max 
-13278  -5615  -1556   3996  32819 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  6.759e+03  1.877e+03   3.601 0.000337 ***
Km          -1.698e-01  3.187e-02  -5.326 1.31e-07 ***
Cylindrée    3.792e+03  6.832e+02   5.551 3.87e-08 ***
Litre       -7.872e+02  8.671e+02  -0.908 0.364196    
Portes      -1.543e+03  3.205e+02  -4.814 1.77e-06 ***
Régulateur   6.289e+03  6.580e+02   9.558  < 2e-16 ***
HP          -1.994e+03  5.718e+02  -3.487 0.000515 ***
Cuir         3.349e+03  5.977e+02   5.604 2.89e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7388 on 796 degrees of freedom
Multiple R-squared:  0.4463,    Adjusted R-squared:  0.4414 
F-statistic: 91.64 on 7 and 796 DF,  p-value: < 2.2e-16

Analyse:

1 - Estimate (Estmations) :

  • Pour chaque kilometre Km de plus dans le compteur d’une voiture, le Prix moyen diminue en moyenne de 1.698e-01 $ U.S soit 101.88 FCFA , si le taux de conversion est 1$ = 6oo F CFA.

  • Pour chaque Cylindre de plus, le Prix moyen d’une voiture augmente en moyenne de 3.792e+03 $ U.S soit 2.275.200 FCFA , si le taux de conversion est 1$ = 6oo F CFA.

  • S’il y’a presence de Régulateur (cruise control), le Prix moyen d’une voiture augmente en moyenne de 6.289e+03 $ U.S soit 3.773.400 FCFA , si le taux de conversion est 1$ = 6oo F CFA.

  • Le fait que les sieges de la voiture sont en Cuir fait augmenter le Prix moyen de la voiture en moyenne de 3.349e+03 $ U.S soit 2.009.400 FCFA, si le taux de conversion est 1$ = 6oo F CFA.

  • La dimunition d’une unite du nombre de Portes de la Voiture fait dimunier le Prix moyen en moyenne de 1.543e+03 $ U.S soit 925.800 FCFA, si le taux de conversion est 1$ = 6oo F CFA.

  • Une non presence de haut-parleurs Dolby stéréo ( HP ) dans la voiture fait diminuer son Prix en moyenne de 1.994e+03 $ U.S soit 1.196.400 FCFA, si le taux de conversion est 1$ = 6oo F CFA.

2 - Les codes de significativité : d’apres les codes, les coefficients sont tous significatifs avec 3 etoiles ( *** ) sauf pour la variale Litre

4-1-2 Graphique des residus

plot(model_reg_multiple)

NA

4-1-2 Test de normalité des résidus

shapiro.test(resid(model_reg_multiple))

    Shapiro-Wilk normality test

data:  resid(model_reg_multiple)
W = 0.92927, p-value < 2.2e-16

Interpretation :

  • Le W = 0.92927 est tres proche de 1 donc les données semblent suivre une distribution normale. La proximite a 1 indique une adequation a la normalite.

  • la p-value = 0.00000000000000022 est inferieure au seuil alpha=0,05 donc l’hypothese nulle H0 est rejetee donc les donnees sont normalement distribuees.

5 - 38 prévisions avec des intervalles de prévision et confiance de 95% et 99% avec le model1

fit=valeure ajustee lwr=valeure minimale upr=valeure maximale

5-1 38 Prédictions avec intervalle de prédiction 95%

predictions1 <- predict(model1, interval = "prediction", level = 0.95)
Avis dans predict.lm(model1, interval = "prediction", level = 0.95) :
  les prédictions sur les données actuelles se réfèrent à des réponses _futures_
head(predictions1,38)
        fit      lwr      upr
1  24308.16 8330.675 40285.64
2  24308.16 8330.675 40285.64
3  24308.16 8330.675 40285.64
4  24308.16 8330.675 40285.64
5  24308.16 8330.675 40285.64
6  24308.16 8330.675 40285.64
7  24308.16 8330.675 40285.64
8  24308.16 8330.675 40285.64
9  24308.16 8330.675 40285.64
10 24308.16 8330.675 40285.64
11 24308.16 8330.675 40285.64
12 24308.16 8330.675 40285.64
13 24308.16 8330.675 40285.64
14 24308.16 8330.675 40285.64
15 24308.16 8330.675 40285.64
16 24308.16 8330.675 40285.64
17 24308.16 8330.675 40285.64
18 24308.16 8330.675 40285.64
19 24308.16 8330.675 40285.64
20 24308.16 8330.675 40285.64
21 24308.16 8330.675 40285.64
22 24308.16 8330.675 40285.64
23 24308.16 8330.675 40285.64
24 24308.16 8330.675 40285.64
25 24308.16 8330.675 40285.64
26 24308.16 8330.675 40285.64
27 24308.16 8330.675 40285.64
28 24308.16 8330.675 40285.64
29 24308.16 8330.675 40285.64
30 24308.16 8330.675 40285.64
31 24308.16 8330.675 40285.64
32 24308.16 8330.675 40285.64
33 24308.16 8330.675 40285.64
34 24308.16 8330.675 40285.64
35 24308.16 8330.675 40285.64
36 24308.16 8330.675 40285.64
37 24308.16 8330.675 40285.64
38 24308.16 8330.675 40285.64

5-2 38 Prédictions avec intervalle de prédiction 99%

predictions2 <- predict(model1, interval = "prediction", level = 0.99)
Avis dans predict.lm(model1, interval = "prediction", level = 0.99) :
  les prédictions sur les données actuelles se réfèrent à des réponses _futures_
head(predictions2, 38)
        fit      lwr      upr
1  24308.16 3291.864 45324.45
2  24308.16 3291.864 45324.45
3  24308.16 3291.864 45324.45
4  24308.16 3291.864 45324.45
5  24308.16 3291.864 45324.45
6  24308.16 3291.864 45324.45
7  24308.16 3291.864 45324.45
8  24308.16 3291.864 45324.45
9  24308.16 3291.864 45324.45
10 24308.16 3291.864 45324.45
11 24308.16 3291.864 45324.45
12 24308.16 3291.864 45324.45
13 24308.16 3291.864 45324.45
14 24308.16 3291.864 45324.45
15 24308.16 3291.864 45324.45
16 24308.16 3291.864 45324.45
17 24308.16 3291.864 45324.45
18 24308.16 3291.864 45324.45
19 24308.16 3291.864 45324.45
20 24308.16 3291.864 45324.45
21 24308.16 3291.864 45324.45
22 24308.16 3291.864 45324.45
23 24308.16 3291.864 45324.45
24 24308.16 3291.864 45324.45
25 24308.16 3291.864 45324.45
26 24308.16 3291.864 45324.45
27 24308.16 3291.864 45324.45
28 24308.16 3291.864 45324.45
29 24308.16 3291.864 45324.45
30 24308.16 3291.864 45324.45
31 24308.16 3291.864 45324.45
32 24308.16 3291.864 45324.45
33 24308.16 3291.864 45324.45
34 24308.16 3291.864 45324.45
35 24308.16 3291.864 45324.45
36 24308.16 3291.864 45324.45
37 24308.16 3291.864 45324.45
38 24308.16 3291.864 45324.45

5-3 38 Prédictions avec intervalle de confiance de 95%

predictions3 <- predict(model1, interval = "confidence", level = 0.95)
head(predictions3,38)
        fit      lwr     upr
1  24308.16 23671.61 24944.7
2  24308.16 23671.61 24944.7
3  24308.16 23671.61 24944.7
4  24308.16 23671.61 24944.7
5  24308.16 23671.61 24944.7
6  24308.16 23671.61 24944.7
7  24308.16 23671.61 24944.7
8  24308.16 23671.61 24944.7
9  24308.16 23671.61 24944.7
10 24308.16 23671.61 24944.7
11 24308.16 23671.61 24944.7
12 24308.16 23671.61 24944.7
13 24308.16 23671.61 24944.7
14 24308.16 23671.61 24944.7
15 24308.16 23671.61 24944.7
16 24308.16 23671.61 24944.7
17 24308.16 23671.61 24944.7
18 24308.16 23671.61 24944.7
19 24308.16 23671.61 24944.7
20 24308.16 23671.61 24944.7
21 24308.16 23671.61 24944.7
22 24308.16 23671.61 24944.7
23 24308.16 23671.61 24944.7
24 24308.16 23671.61 24944.7
25 24308.16 23671.61 24944.7
26 24308.16 23671.61 24944.7
27 24308.16 23671.61 24944.7
28 24308.16 23671.61 24944.7
29 24308.16 23671.61 24944.7
30 24308.16 23671.61 24944.7
31 24308.16 23671.61 24944.7
32 24308.16 23671.61 24944.7
33 24308.16 23671.61 24944.7
34 24308.16 23671.61 24944.7
35 24308.16 23671.61 24944.7
36 24308.16 23671.61 24944.7
37 24308.16 23671.61 24944.7
38 24308.16 23671.61 24944.7

5-4 38 Prédictions avec intervalle de confiance de 99%

predictions4 <- predict(model1, interval = "confidence", level = 0.99)
head(predictions4,38)
        fit      lwr      upr
1  24308.16 23470.87 25145.45
2  24308.16 23470.87 25145.45
3  24308.16 23470.87 25145.45
4  24308.16 23470.87 25145.45
5  24308.16 23470.87 25145.45
6  24308.16 23470.87 25145.45
7  24308.16 23470.87 25145.45
8  24308.16 23470.87 25145.45
9  24308.16 23470.87 25145.45
10 24308.16 23470.87 25145.45
11 24308.16 23470.87 25145.45
12 24308.16 23470.87 25145.45
13 24308.16 23470.87 25145.45
14 24308.16 23470.87 25145.45
15 24308.16 23470.87 25145.45
16 24308.16 23470.87 25145.45
17 24308.16 23470.87 25145.45
18 24308.16 23470.87 25145.45
19 24308.16 23470.87 25145.45
20 24308.16 23470.87 25145.45
21 24308.16 23470.87 25145.45
22 24308.16 23470.87 25145.45
23 24308.16 23470.87 25145.45
24 24308.16 23470.87 25145.45
25 24308.16 23470.87 25145.45
26 24308.16 23470.87 25145.45
27 24308.16 23470.87 25145.45
28 24308.16 23470.87 25145.45
29 24308.16 23470.87 25145.45
30 24308.16 23470.87 25145.45
31 24308.16 23470.87 25145.45
32 24308.16 23470.87 25145.45
33 24308.16 23470.87 25145.45
34 24308.16 23470.87 25145.45
35 24308.16 23470.87 25145.45
36 24308.16 23470.87 25145.45
37 24308.16 23470.87 25145.45
38 24308.16 23470.87 25145.45

5-5 Verification d’un quelconque ressemblance entre les differentes series de predictions

# Verification d'un quelconque ressemblance
identical(predictions1, predictions3)
[1] FALSE
# Verification d'un quelconque ressemblance
identical(predictions2, predictions4)
[1] FALSE
# Verification d'un quelconque ressemblance
identical(predictions1, predictions2)
[1] FALSE

identical(predictions3, predictions4)
[1] FALSE
LS0tDQp0aXRsZTogIlBST0pFVCBERSBNT0RFTElTQVRJT04gU1RBVElTVElRVUUgRFUgUFJJWCBERVMgVk9JVFVSRVMgREUgRkFCUklDQVRJT04gQU1FUklDQUlORSBTVVIgTEUgTUFSQ0hFIERFUyBFVEFUUy1VTklTIg0KYXV0aG9yOiAiTW9oYW1lZCBGYWxpbG91IEZhbGwiDQpkYXRlOiAiMjAyNC0wNy0xNyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQpMZXMgMTEgdmFyaWFibGVzOiAiS20iIChraWxvbcOpdHJhZ2UgZHUgdsOpaGljdWxlKSwgIk1hcnF1ZSIgKG1hcnF1ZSBkdSB2w6loaWN1bGUpLCAiTW9kw6hsZSIgKG1vZMOobGUgZHUgdsOpaGljdWxlKSwgIlNvdXMtbW9kw6hsZSIgKHZhcmllbnQgc2Vsb24gbGVzIG9wdGlvbnMpLCAiVHlwZSIgKGRlIGNhcnJvc3NlcmllKSwgIkN5bGluZHLDqSIgKG1vdGV1ciksICJMaXRyZSIgKG1lc3VyZSBwbHVzIHByw6ljaXNlIGRlIGxhIHRhaWxsZSBkdSBtb3RldXIpLCAiUG9ydGVzIiAoTm9tYnJlIGRlIHBvcnRlcyksICJSw6lndWxhdGV1ciIsICJIUCIgKGhhdXQtcGFybGV1cnMgRG9sYnkgc3TDqXLDqW8pLCAiQ3VpciIgKGludMOpcmlldXIgY3VpcikuDQoNCg0KTGVzIE1hcnF1ZXMsICJCdWljayIgLCAiQ2FkaWxsYWMiICwgIkNoZXZyb2xldCIgLCAiUG9udGlhYyIgLCAiU2F0dXJuIiwgc29udCBkZSBmYWJyaWNhdGlvbiBhbWVyaWNhaW5lLg0KTGEgbWFycXVlICJTQUFCIiBlc3QgZGUgZmFicmljYXRpb24gc3VlZG9pc2UuDQoNCiAgICAgICANCiMgMS0gTGUgRGF0YUZyYW1lDQoNCiMjIDEtMSBBZmZpY2hhZ2UgZGVzIDcgcHJlbWllcmVzIGxpZ25lcyBkdSBEYXRhRnJhbWUgDQpgYGB7cn0NCmhlYWQoQmFzZV9Qcm9qZXRfSW50cm9kdWN0aW9uX01vZGVsaXNhdGlvbl8yMDI0LDcpDQpgYGANCiMjIDEtMiBJbmZvcm1hdGlvbnMgdGlyZWVzIGR1IERhdGFGcmFtZQ0KDQpgYGB7cn0NCiMgTGEgZGltZW5zaW9uIGR1IERhdGFGcmFtZSAoODA0IHZvaXR1cmVzIGV0IDEyIHZhcmlhYmxlcykNCmRpbShCYXNlX1Byb2pldF9JbnRyb2R1Y3Rpb25fTW9kZWxpc2F0aW9uXzIwMjQpDQpgYGANCmBgYHtyfQ0KIyBMZXMgTWFycXVlcyBkZSB2b2l0dXJlcyBldCBsZXVycyBmcmVxdWVuY2VzDQpmcmVxdWVuY2VfbWFycXVlIDwtIHRhYmxlKEJhc2VfUHJvamV0X0ludHJvZHVjdGlvbl9Nb2RlbGlzYXRpb25fMjAyNCRNYXJxdWUpDQpwcmludChmcmVxdWVuY2VfbWFycXVlKQ0KYGBgDQoNCmBgYHtyfQ0KIyBDb21wdGUgZGVzIE1vZMOobGVzIGRlIHZvaXR1cmVzIGV0IGxldXJzIGZyZXF1ZW5jZXMNCmZyZXF1ZW5jZV9tb2RlbGUgPC0gdGFibGUoQmFzZV9Qcm9qZXRfSW50cm9kdWN0aW9uX01vZGVsaXNhdGlvbl8yMDI0JE1vZMOobGUpDQpwcmludChmcmVxdWVuY2VfbW9kZWxlKQ0KYGBgDQoNCmBgYHtyfQ0KDQojIGBWYWxldXJlIG1pbmltYWxlIGQndW5lIHZvaXR1cmUgPSA1LjE4Mi44NDAgIEYgQ0ZBYA0KIyBgVmFsZXVyZSBtYXhpbWFsZSBkJ3VuZSB2b2l0dXJlID0gNDIuNDQ5LjAzNCBGIENGQWANCg0KcHJpeF9taW5pbWFsIDwtIG1pbihCYXNlX1Byb2pldF9JbnRyb2R1Y3Rpb25fTW9kZWxpc2F0aW9uXzIwMjQkUHJpeCkNCnByaXhfbWF4aW1hbCA8LSBtYXgoQmFzZV9Qcm9qZXRfSW50cm9kdWN0aW9uX01vZGVsaXNhdGlvbl8yMDI0JFByaXgpDQoNCg0KDQpwcmludChwYXN0ZSgiTGUgcHJpeCBtaW5pbWFsIGVuICQgZCd1bmUgdm9pdHVyZSBkZSBtYXJxdWUgYW1lcmljYWluZSBlc3QgZWdhbCBhOiIsIHByaXhfbWluaW1hbCwgIiwgIiAgLCJzb2l0OiIsIDU5OS45NCAqIHByaXhfbWluaW1hbCwgIkYgQ0ZBIikpDQoNCg0KDQpwcmludChwYXN0ZSgiTGUgcHJpeCBtYXhpbWFsIGVuICQgZCd1bmUgdm9pdHVyZSBkZSBtYXJxdWUgYW1lcmljYWluZSBlc3QgZWdhbCBhOiIsIHByaXhfbWF4aW1hbCwgIiwgIiAgLCJzb2l0OiIsIDU5OS45NCAqIHByaXhfbWF4aW1hbCwgIkYgQ0ZBIikpDQoNCmBgYA0KDQoNCg0KIyAyLSBJZGVudGlmaWNhdGlvbiBkZXMgMyB2YXJpYWJsZXMgbGVzIHBsdXMgY29ycsOpbMOpZXMgw6AgbGEgdmFyaWFibGUgZMOpcGVuZGFudGUgUHJpeC4gDQoNCiMjIDItMSAtIFNlcGVyYXRpb24gZGVzIHZhcmlhYmxlcyBudW1lcmlxdWVzIGBudW1fdmFyc2AgZGVzIHZhcmlhYmxlcyBjYXRlZ29yaWVsbGVzIGBjYXRfdmFyc2ANCg0KDQoNCmBgYHtyfQ0KDQpudW1fdmFycyA8LSBCYXNlX1Byb2pldF9JbnRyb2R1Y3Rpb25fTW9kZWxpc2F0aW9uXzIwMjRbLCBzYXBwbHkoQmFzZV9Qcm9qZXRfSW50cm9kdWN0aW9uX01vZGVsaXNhdGlvbl8yMDI0LCBpcy5udW1lcmljKV0NCg0KY2F0X3ZhcnMgPC0gQmFzZV9Qcm9qZXRfSW50cm9kdWN0aW9uX01vZGVsaXNhdGlvbl8yMDI0Wywgc2FwcGx5KEJhc2VfUHJvamV0X0ludHJvZHVjdGlvbl9Nb2RlbGlzYXRpb25fMjAyNCwgaXMuZmFjdG9yKSB8IHNhcHBseShkZiwgaXMuY2hhcmFjdGVyKV0NCg0KYGBgDQoNCg0KDQojIyAyLTIgIEFmaWNoYWdlIGRlIGxhIGJhc2UgZGUgZG9ubmVlcyBkZXMgdmFyaWFibGVzIG51bWVyaXF1ZXMgYG51bV92YXJzYA0KYGBge3J9DQpoZWFkKG51bV92YXJzLDcpDQpgYGANCg0KDQoNCiMjIDItMyBDb3JyZWxhdGlvbiBlbnRyZSBsZXMgdmFyaWFibGVzIG51bWVyaXF1ZXMgYG51bV92YXJzYA0KYGBge3J9DQpjb3JyZWxhdGlvbnMgPC0gY29yKG51bV92YXJzKQ0KY29ycmVsYXRpb25zDQoNCmBgYA0KYGBge3J9DQojIEhlYXRtYXAgQ29ycmVsYXRpb24gZW50cmUgbGVzIHZhcmlhYmxlcyBudW1lcmlxdWVzIGBudW1fdmFyc2ANCg0KbGlicmFyeShjb3JycGxvdCkNCg0KY29ycnBsb3QoY29ycmVsYXRpb25zLCBtZXRob2QgPSAiY29sb3IiLCB0eXBlID0gInVwcGVyIiwgDQogICAgICAgICB0bC5jb2wgPSAiYmxhY2siLCB0bC5zcnQgPSA0NSwNCiAgICAgICAgIGNvbCA9IGNvbG9yUmFtcFBhbGV0dGUoYygiYmx1ZSIsICJ3aGl0ZSIsICJyZWQiKSkoMjAwKSkNCg0KYGBgDQoNCg0KIyMgMi00IEV4dHJhY3Rpb24gZGUgbGEgdmFyaWFibGUgZGVwZW5kYW50ZSBgUHJpeGANCmBgYHtyfQ0KZGVwZW5kYW50ZV92YXIgPC0gIlByaXgiDQpkZXBlbmRhbnRlX3Zhcg0KYGBgDQoNCg0KIyMgMi01IEV4dHJhY3Rpb24gZGVzIGNvcnLDqWxhdGlvbnMgYXZlYyBsYSB2YXJpYWJsZSBkw6lwZW5kYW50ZSBgUHJpeGANCmBgYHtyfQ0KY29yX2F2ZWNfcHJpeCA8LSBjb3JyZWxhdGlvbnNbLCBkZXBlbmRhbnRlX3Zhcl0NCmNvcl9hdmVjX3ByaXgNCmBgYA0KDQoNCiMjIDItNyBUcmkgcGFyIG9yZHJlIGRlcyBjb3Jyw6lsYXRpb25zIGF2ZWMgbGEgdmFyaWFibGUgZMOpcGVuZGFudGUgYFByaXhgDQpgYGB7cn0NCnRyaV9jb3JyZWxhdGlvbnMgPC0gc29ydChhYnMoY29yX2F2ZWNfcHJpeCksIGRlY3JlYXNpbmcgPSBUUlVFKQ0KdHJpX2NvcnJlbGF0aW9ucw0KYGBgDQoNCg0KIyMgSW50ZXJwcmV0YXRpb24gOg0KDQo8Zm9udCBjb2xvcj0iTWFyb29uIj4NCg0KDQoNCioqTGVzIDMgdmFyaWFibGVzIGxlcyBwbHVzIGNvcnLDqWzDqWVzIMOgIGxhIHZhcmlhYmxlIGTDqXBlbmRhbnRlIGBQcml4YCBzb250IGBDeWxpbmRyw6llYCwgYExpdHJlYCBldCBgUsOpZ3VsYXRldXJgKioNCg0KPC9mb250Pg0KDQoNCg0KIyAzIC0gTWlzZSBlbiBwbGFjZSBkZSAzIG1vZMOobGVzIGRlIHLDqWdyZXNzaW9uIGxpbsOpYWlyZSBzaW1wbGUgZXQgQ29tcGFyYWlzb25zIGRlcyBtb2TDqGxlcw0KDQoNCg0KIyMgMy0xIEFqdXN0ZW1lbnQgZHUgbW9kw6hsZSBkZSByw6lncmVzc2lvbiBsaW7DqWFpcmUgYFByaXhgLCBgQ3lsaW5kcsOpZWA6IGxlIGBtb2RlbDFgDQoNCg0KYGBge3J9DQoNCm1vZGVsMSA8LSBsbShQcml4IH4gQ3lsaW5kcsOpZSwgZGF0YSA9IG51bV92YXJzKQ0Kc3VtbWFyeShtb2RlbDEpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCg0KDQpwIDwtIGdncGxvdChudW1fdmFycywgYWVzKHggPSBQcml4LCB5ID0gQ3lsaW5kcsOpZSkpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICdibHVlJykgKyANCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgY29sb3IgPSAncmVkJykgKyANCiAgbGFicyh0aXRsZSA9ICJSw6lncmVzc2lvbiBsaW7DqWFpcmUgZW50cmUgUHJpeCBldCBDeWxpbmRyw6llIiwgeCA9ICJQcml4IiwgeSA9ICJDeWxpbmRyw6llIikNCg0KDQpwX2ludGVyYWN0aWYxIDwtIGdncGxvdGx5KHApDQoNCg0KcF9pbnRlcmFjdGlmMQ0KDQpgYGANCg0KDQoNCiMjIDMtMiBBanVzdGVtZW50IGR1IG1vZMOobGUgZGUgcsOpZ3Jlc3Npb24gbGluw6lhaXJlIGBQcml4YCwgYExpdHJlYDogbGUgYG1vZGVsMmANCg0KYGBge3J9DQptb2RlbDIgPC0gbG0oUHJpeCB+IExpdHJlLCBkYXRhID0gbnVtX3ZhcnMpDQpzdW1tYXJ5KG1vZGVsMikNCmBgYA0KYGBge3J9DQoNCg0KcCA8LSBnZ3Bsb3QobnVtX3ZhcnMsIGFlcyh4ID0gUHJpeCwgeSA9IExpdHJlKSkgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gJ2JsdWUnKSArIA0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvciA9ICdyZWQnKSArIA0KICBsYWJzKHRpdGxlID0gIlLDqWdyZXNzaW9uIGxpbsOpYWlyZSBlbnRyZSBQcml4IGV0IExpdHJlIiwgeCA9ICJQcml4IiwgeSA9ICJMaXRyZSIpDQoNCg0KcF9pbnRlcmFjdGlmMiA8LSBnZ3Bsb3RseShwKQ0KDQoNCnBfaW50ZXJhY3RpZjINCmBgYA0KDQoNCg0KIyMgMy0zIEFqdXN0ZW1lbnQgZHUgbW9kw6hsZSBkZSByw6lncmVzc2lvbiBsaW7DqWFpcmUgYFByaXhgLCBgUsOpZ3VsYXRldXJgOiBsZSBgbW9kZWwzYA0KDQpgYGB7cn0NCm1vZGVsMyA8LSBsbShQcml4IH4gUsOpZ3VsYXRldXIsIGRhdGEgPSBudW1fdmFycykNCnN1bW1hcnkobW9kZWwzKQ0KYGBgDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGxvdGx5KQ0KDQoNCnAgPC0gZ2dwbG90KG51bV92YXJzLCBhZXMoeCA9IFByaXgsIHkgPSBSw6lndWxhdGV1cikpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICdibHVlJykgKyANCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgY29sb3IgPSAncmVkJykgKyANCiAgbGFicyh0aXRsZSA9ICJSw6lncmVzc2lvbiBsaW7DqWFpcmUgZW50cmUgUHJpeCBldCBSw6lndWxhdGV1ciIsIHggPSAiUHJpeCIsIHkgPSAiUsOpZ3VsYXRldXIiKQ0KDQoNCnBfaW50ZXJhY3RpZjMgPC0gZ2dwbG90bHkocCkNCg0KDQpwX2ludGVyYWN0aWYzDQpgYGANCg0KDQojIyAzLTQgQ29tcGFyYWlzb24gZGVzIDMgbW9kZWxzKCBgbW9kZWwxYCwgYG1vZGVsMmAsIGBtb2RlbDNgKQ0KDQoNCg0KIyMjIDMtNC0xIENvbXBhcmFpc29uIGRlcyBgUi1zcXVhcmVkIChSwrIpYCAsIGBBZGp1c3RlZCBSLXNxdWFyZWRgICwgYEFJQ2AgLCBgQklDYCAsIGBDb2VmZmljaWVudHNgICwgYHAtdmFsdWVgIA0KYGBge3J9DQojIEV4dHJhY3Rpb24gZGVzIGluZm9ybWF0aW9ucyBpbXBvcnRhbnRlcyBwb3VyIGxhIGNvbXBhcmFpc29uDQoNCm1vZGVscyA8LSBsaXN0KG1vZGVsMSwgbW9kZWwyLCBtb2RlbDMpDQpub21zX21vZGVscyA8LSBjKCJNb2RlbDEgKFByaXggfiBDeWxpbmRyw6llKSIsICJNb2RlbDIgKFByaXggfiBMaXRyZSkiLCAiTW9kZWwzIChQcml4IH4gUsOpZ3VsYXRldXIpIikNCg0KcmVzdWx0YXRzX2NvbXBhcmVzIDwtIGRhdGEuZnJhbWUoDQogIE1vZGVsID0gbm9tc19tb2RlbHMsDQogIFJfc3F1YXJlZCA9IHNhcHBseShtb2RlbHMsIGZ1bmN0aW9uKG1vZGVsKSBzdW1tYXJ5KG1vZGVsKSRyLnNxdWFyZWQpLA0KICBBZGp1c3RlZF9SX3NxdWFyZWQgPSBzYXBwbHkobW9kZWxzLCBmdW5jdGlvbihtb2RlbCkgc3VtbWFyeShtb2RlbCkkYWRqLnIuc3F1YXJlZCksDQogIEFJQyA9IHNhcHBseShtb2RlbHMsIEFJQyksDQogIEJJQyA9IHNhcHBseShtb2RlbHMsIEJJQyksDQogIHBfdmFsdWUgPSBzYXBwbHkobW9kZWxzLCBmdW5jdGlvbihtb2RlbCkgYW5vdmEobW9kZWwpJGBQcig+RilgWzFdKQ0KKQ0KDQpwcmludChyZXN1bHRhdHNfY29tcGFyZXMpDQoNCmBgYA0KDQoNCiMjIEludGVycHJldGF0aW9uOg0KPGZvbnQgY29sb3I9Ik1hcm9vbiI+DQoNCg0KDQogDQogLSBMZSBgUl9TcXVhcmVkYCA6IExhIHByb3BvcnRpb24gZGUgbGEgdmFyaWFuY2UgdG90YWxlIGRlcyBkb25uw6llcyBxdWkgZXN0IGV4cGxpcXXDqWUgcGFyIGxlIGBtb2TDqGxlMWAgZXN0IHBsdXMgZWxldmUgcXVlIGNldXggZGVzIDIgYXV0cmVzIG1vZGVscy4gUGx1cyBsZSBgUi1zcXVhcmVkYCBlc3Qgw6lsZXbDqSwgbWVpbGxldXIgZXN0IGwnYWp1c3RlbWVudCBkdSBtb2TDqGxlIGF1eCBkb25uw6llcy4gRG9uYyBsZSBgbW9kZWwxYCBlc3QgbGUgbWVpbGxldXIgbW9kZWwgc2kgbm91cyBub3VzIGJhc29ucyB1bmlxdWVtZW50IHN1ciBsZSBgUl9TcXVhcmVkYC4NCg0KIC0gYEFkanVzdGVkX1Jfc3F1YXJlZGAgOiBMYSB2YWxldXJlIGRlIGwnYEFkanVzdGVkIFItc3F1YXJlZGAgZHUgYG1vZGVsMWAgaW5kaXF1ZSB1biBtZWlsbGV1ciBhanVzdGVtZW50IGR1IG1vZMOobGUgYXV4IGRvbm7DqWVzIGNhciBldGFudCBwbHVzIGVsZXZlLiBEb25jIGxlIGBtb2RlbDFgIGVzdCBsZSBtZWlsbGV1ciBtb2RlbCBzaSBub3VzIG5vdXMgYmFzb25zIHVuaXF1ZW1lbnQgc3VyIGwnYEFkanVzdGVkX1Jfc3F1YXJlZGAuDQoNCi0gTGUgYG1vZGVsMWAgYSBsYSBwbHVzIHBldGl0ZSB2YWxldXIgZCdgQUlDYCAoQWthaWtlIEluZm9ybWF0aW9uIENyaXRlcmlvbikgZG9uYyBpbCBlc3QgbGUgbWVpbGxldXIgbW9kZWwuIA0KDQotIExlIGBCSUNgIChCYXllc2lhbiBJbmZvcm1hdGlvbiBDcml0ZXJpYSkgZHUgYG1vZGVsMWAgZXN0IHBsdXMgYmFzIHF1ZSBjZWx1aSBkZXMgMiBhdXRyZXMgZG9uYyBub3VzIGNob2lzaXNvbnMgbGUgYG1vZGVsMWAuDQoNCi0gTGUgYG1vZGVsMWAgYSB1biB2YXJpYWJsZSBwcsOpZGljdGl2ZSBgQ3lsaW5kcsOpZWAgYXlhbnQgdW4gcC12YWx1ZSBzaWduaWZpY2F0aXZlbWVudCBmYWlibGUgZXQgZXN0IGNvbnNpZMOpcsOpIGNvbW1lIGxlIG1laWxsZXVyIGNhciBpbCBpbmRpcXVlIHVuZSBtZWlsbGV1cmUgYWTDqXF1YXRpb24gZHUgdmFyaWFibGUgYEN5bGluZHLDqWVgIHV0aWxpc8OpZSBwb3VyIGV4cGxpcXVlciBsYSB2YXJpYWJsZSBgUHJpeCBgDQoNCjwvZm9udD4NCg0KDQoNCiMjIyAzLTQtMiBWaXN1YWxpc2F0aW9uIGRlcyByZXNpZHVzDQoNCmBgYHtyfQ0KIyBMZSBUcmFjZSBsZXMgcsOpc2lkdXMgdnMgbGVzIHZhbGV1cnMgYWp1c3TDqWVzIHBvdXIgY2hhcXVlIG1vZMOobGUNCg0KcGFyKG1mcm93ID0gYygxLCAzKSkgICMgRGlzcG9zaXRpb24gZGVzIGdyYXBoaXF1ZXMgZW4gdW5lIGxpZ25lIGV0IHRyb2lzIGNvbG9ubmVzDQoNCnBsb3QobW9kZWwxJGZpdHRlZC52YWx1ZXMsIG1vZGVsMSRyZXNpZHVhbHMsIG1haW4gPSAiTW9kZWwxIChQcml4IH4gQ3lsaW5kcsOpZSkiLA0KICAgICB4bGFiID0gIlZhbGV1cnMgYWp1c3TDqWVzIiwgeWxhYiA9ICJSw6lzaWR1cyIpDQphYmxpbmUoaCA9IDAsIGNvbCA9ICJyZWQiKQ0KDQpwbG90KG1vZGVsMiRmaXR0ZWQudmFsdWVzLCBtb2RlbDIkcmVzaWR1YWxzLCBtYWluID0gIk1vZGVsMiAoUHJpeCB+IExpdHJlKSIsDQogICAgIHhsYWIgPSAiVmFsZXVycyBhanVzdMOpZXMiLCB5bGFiID0gIlLDqXNpZHVzIikNCmFibGluZShoID0gMCwgY29sID0gInJlZCIpDQoNCnBsb3QobW9kZWwzJGZpdHRlZC52YWx1ZXMsIG1vZGVsMyRyZXNpZHVhbHMsIG1haW4gPSAiTW9kZWwzIChQcml4IH4gUsOpZ3VsYXRldXIpIiwNCiAgICAgeGxhYiA9ICJWYWxldXJzIGFqdXN0w6llcyIsIHlsYWIgPSAiUsOpc2lkdXMiKQ0KYWJsaW5lKGggPSAwLCBjb2wgPSAicmVkIikNCg0KYGBgDQoNCiMjIEludGVycHJldGF0aW9uIDoNCg0KPGZvbnQgY29sb3I9Ik1hcm9vbiI+DQoNCg0KDQotIGxlIGBNb2RlbDJgIGEgdW5lIHLDqXBhcnRpdGlvbiB1bmlmb3JtZSBldCBhbMOpYXRvaXJlIGRlcyByw6lzaWR1cyBhdXRvdXIgZGUgbGEgbGlnbmUgesOpcm8gKGxpZ25lIHJvdWdlKS4gVW5lIGRpc3RyaWJ1dGlvbiB1bmlmb3JtZSBkdSBgbW9kZWwyYCBzdWdnw6hyZSBxdWUgbGVzIGVycmV1cnMgZGUgcHLDqWRpY3Rpb24gc29udCByw6lwYXJ0aWVzIGRlIG1hbmnDqHJlIMOpcXVpdGFibGUgc3VyIGwnZW5zZW1ibGUgZGVzIGRvbm5lZXMgYG51bV92YXJzYC4NCg0KPC9mb250Pg0KDQoNCg0KIyA0IC0gQW5hbHlzZSBtdWx0aXZhcmnDqWUgcG91ciBkw6ljcmlyZSBsZSBwcm9jZXNzdXMgZCdhdHRyaWJ1dGlvbiBkdSBQcml4IGQndW4gdsOpaGljdWxlIGVuIGZvbmN0aW9uIGRlcyBjYXJhY3TDqXJpc3RpcXVlcyBxdWFudGl0YXRpdmVzLg0KDQoNCg0KIyMgNC0xIFLDqWdyZXNzaW9uIGxpbsOpYWlyZSBtdWx0aXBsZSAoSW50ZXJwcmV0YXRpb24gZHUgbW9kZWwpDQoNCg0KDQojIyMgNC0xLTEgQW5hbHlzZSBkdSBgc3VtbWFyeWAgZHUgbW9kZWwgZGUgcmVncmVzc2lvbiBtdWx0aXBsZQ0KYGBge3J9DQptb2RlbF9yZWdfbXVsdGlwbGUgPC0gbG0oUHJpeCB+IEttICsgQ3lsaW5kcsOpZSArIExpdHJlICsgUG9ydGVzICsgUsOpZ3VsYXRldXIgKyBIUCArIEN1aXIsIGRhdGEgPSBudW1fdmFycykNCg0Kc3VtbWFyeShtb2RlbF9yZWdfbXVsdGlwbGUpDQpgYGANCg0KIyMgQW5hbHlzZToNCg0KPGZvbnQgY29sb3I9Ik1hcm9vbiI+DQoNCiANCg0KDQogDQogMSAtIGBFc3RpbWF0ZWAgKEVzdG1hdGlvbnMpIDoNCiANCiAtIFBvdXIgY2hhcXVlIGtpbG9tZXRyZSBgS21gIGRlIHBsdXMgZGFucyBsZSBjb21wdGV1ciBkJ3VuZSB2b2l0dXJlLCBsZSBQcml4IG1veWVuIGRpbWludWUgZW4gbW95ZW5uZSBkZSBgMS42OThlLTAxICQgVS5TYCBzb2l0IGAxMDEuODggRkNGQWAgLCBzaSBsZSB0YXV4IGRlIGNvbnZlcnNpb24gZXN0IDEkID0gNm9vIEYgQ0ZBLg0KIA0KIC0gUG91ciBjaGFxdWUgYEN5bGluZHJlYCBkZSBwbHVzLCBsZSBQcml4IG1veWVuIGQndW5lIHZvaXR1cmUgYXVnbWVudGUgZW4gbW95ZW5uZSBkZSBgMy43OTJlKzAzICQgVS5TYCBzb2l0IGAyLjI3NS4yMDAgRkNGQWAgLCBzaSBsZSB0YXV4IGRlIGNvbnZlcnNpb24gZXN0IDEkID0gNm9vIEYgQ0ZBLg0KIA0KIA0KIC0gUydpbCB5J2EgcHJlc2VuY2UgZGUgYFLDqWd1bGF0ZXVyYCAoY3J1aXNlIGNvbnRyb2wpLCBsZSBQcml4IG1veWVuIGQndW5lIHZvaXR1cmUgYXVnbWVudGUgZW4gbW95ZW5uZSBkZSBgNi4yODllKzAzICQgVS5TYCBzb2l0IGAzLjc3My40MDAgRkNGQWAgLCBzaSBsZSB0YXV4IGRlIGNvbnZlcnNpb24gZXN0IDEkID0gNm9vIEYgQ0ZBLg0KIA0KIC0gTGUgZmFpdCBxdWUgbGVzIHNpZWdlcyBkZSBsYSB2b2l0dXJlIHNvbnQgZW4gYEN1aXJgIGZhaXQgYXVnbWVudGVyIGxlIFByaXggbW95ZW4gZGUgbGEgdm9pdHVyZSBlbiBtb3llbm5lIGRlIGAzLjM0OWUrMDMgJCBVLlNgIHNvaXQgYDIuMDA5LjQwMCBGQ0ZBYCwgc2kgbGUgdGF1eCBkZSBjb252ZXJzaW9uIGVzdCAxJCA9IDZvbyBGIENGQS4NCiANCiAtIExhIGRpbXVuaXRpb24gZCd1bmUgdW5pdGUgZHUgbm9tYnJlIGRlIGBQb3J0ZXNgIGRlIGxhIFZvaXR1cmUgZmFpdCBkaW11bmllciBsZSBQcml4IG1veWVuIGVuIG1veWVubmUgZGUgYDEuNTQzZSswMyAkIFUuU2Agc29pdCBgOTI1LjgwMCBGQ0ZBYCwgc2kgbGUgdGF1eCBkZSBjb252ZXJzaW9uIGVzdCAxJCA9IDZvbyBGIENGQS4NCg0KIC0gVW5lIG5vbiBwcmVzZW5jZSBkZSBoYXV0LXBhcmxldXJzIERvbGJ5IHN0w6lyw6lvICggYEhQYCApIGRhbnMgbGEgdm9pdHVyZSBmYWl0IGRpbWludWVyIHNvbiBQcml4IGVuIG1veWVubmUgZGUgYDEuOTk0ZSswMyAkIFUuU2Agc29pdCBgMS4xOTYuNDAwIEZDRkFgLCBzaSBsZSB0YXV4IGRlIGNvbnZlcnNpb24gZXN0IDEkID0gNm9vIEYgQ0ZBLg0KDQogMiAtIGBMZXMgY29kZXMgZGUgc2lnbmlmaWNhdGl2aXTDqWAgOiBkJ2FwcmVzIGxlcyBjb2RlcywgbGVzIGNvZWZmaWNpZW50cyBzb250IHRvdXMgc2lnbmlmaWNhdGlmcyBhdmVjIDMgZXRvaWxlcyAoIGAgKioqYCApIHNhdWYgcG91ciBsYSB2YXJpYWxlIGBMaXRyZWANCiANCiANCiANCiANCg0KPC9mb250Pg0KDQoNCg0KIyMjIDQtMS0yIEdyYXBoaXF1ZSBkZXMgcmVzaWR1cyANCg0KYGBge3J9DQpwbG90KG1vZGVsX3JlZ19tdWx0aXBsZSkNCg0KYGBgDQoNCg0KDQojIyMgNC0xLTIgVGVzdCBkZSBub3JtYWxpdMOpIGRlcyByw6lzaWR1cw0KYGBge3J9DQpzaGFwaXJvLnRlc3QocmVzaWQobW9kZWxfcmVnX211bHRpcGxlKSkNCmBgYA0KIyMgSW50ZXJwcmV0YXRpb24gOg0KDQo8Zm9udCBjb2xvcj0iTWFyb29uIj4NCg0KICANCg0KLSBMZSBgVyA9IDAuOTI5MjdgIGVzdCB0cmVzIHByb2NoZSBkZSAxIGRvbmMgbGVzIGRvbm7DqWVzIHNlbWJsZW50IHN1aXZyZSB1bmUgZGlzdHJpYnV0aW9uIG5vcm1hbGUuIExhIHByb3hpbWl0ZSBhIDEgaW5kaXF1ZSB1bmUgYWRlcXVhdGlvbiBhIGxhIG5vcm1hbGl0ZS4gDQoNCi0gbGEgYHAtdmFsdWUgPSAwLjAwMDAwMDAwMDAwMDAwMDIyYCBlc3QgaW5mZXJpZXVyZSBhdSBzZXVpbCBgYWxwaGE9MCwwNWAgZG9uYyBsJ2h5cG90aGVzZSBudWxsZSBgSDBgIGVzdCByZWpldGVlIGRvbmMgbGVzIGRvbm5lZXMgc29udCBub3JtYWxlbWVudCBkaXN0cmlidWVlcy4NCiANCiANCg0KPC9mb250Pg0KDQoNCiMgNSAtIGAzOGAgcHLDqXZpc2lvbnMgYXZlYyBkZXMgaW50ZXJ2YWxsZXMgZGUgYHByw6l2aXNpb25gIGV0IGBjb25maWFuY2VgIGRlIGA5NSVgIGV0IGA5OSVgIGF2ZWMgbGUgYG1vZGVsMWANCg0KYGZpdD12YWxldXJlIGFqdXN0ZWVgICAgYGx3cj12YWxldXJlIG1pbmltYWxlYCAgIGB1cHI9dmFsZXVyZSBtYXhpbWFsZWANCg0KDQoNCiMjIDUtMSBgMzhgIFByw6lkaWN0aW9ucyBhdmVjIGludGVydmFsbGUgZGUgYHByw6lkaWN0aW9uYCA5NSUNCg0KYGBge3J9DQpwcmVkaWN0aW9uczEgPC0gcHJlZGljdChtb2RlbDEsIGludGVydmFsID0gInByZWRpY3Rpb24iLCBsZXZlbCA9IDAuOTUpDQpoZWFkKHByZWRpY3Rpb25zMSwzOCkNCmBgYA0KDQoNCiMjIDUtMiBgMzhgIFByw6lkaWN0aW9ucyBhdmVjIGludGVydmFsbGUgZGUgYHByw6lkaWN0aW9uYCA5OSUNCmBgYHtyfQ0KcHJlZGljdGlvbnMyIDwtIHByZWRpY3QobW9kZWwxLCBpbnRlcnZhbCA9ICJwcmVkaWN0aW9uIiwgbGV2ZWwgPSAwLjk5KQ0KaGVhZChwcmVkaWN0aW9uczIsIDM4KQ0KYGBgDQoNCg0KDQojIyA1LTMgYDM4YCBQcsOpZGljdGlvbnMgYXZlYyBpbnRlcnZhbGxlIGRlIGBjb25maWFuY2VgIGRlIDk1JQ0KYGBge3J9DQpwcmVkaWN0aW9uczMgPC0gcHJlZGljdChtb2RlbDEsIGludGVydmFsID0gImNvbmZpZGVuY2UiLCBsZXZlbCA9IDAuOTUpDQpoZWFkKHByZWRpY3Rpb25zMywzOCkNCmBgYA0KDQoNCg0KIyMgNS00IGAzOGAgUHLDqWRpY3Rpb25zIGF2ZWMgaW50ZXJ2YWxsZSBkZSBgY29uZmlhbmNlYCBkZSA5OSUNCmBgYHtyfQ0KcHJlZGljdGlvbnM0IDwtIHByZWRpY3QobW9kZWwxLCBpbnRlcnZhbCA9ICJjb25maWRlbmNlIiwgbGV2ZWwgPSAwLjk5KQ0KaGVhZChwcmVkaWN0aW9uczQsMzgpDQpgYGANCg0KIyMgNS01IFZlcmlmaWNhdGlvbiBkJ3VuIHF1ZWxjb25xdWUgcmVzc2VtYmxhbmNlIGVudHJlIGxlcyBkaWZmZXJlbnRlcyBzZXJpZXMgZGUgcHJlZGljdGlvbnMNCg0KDQpgYGB7cn0NCiMgVmVyaWZpY2F0aW9uIGQndW4gcXVlbGNvbnF1ZSByZXNzZW1ibGFuY2UNCmlkZW50aWNhbChwcmVkaWN0aW9uczEsIHByZWRpY3Rpb25zMykNCmBgYA0KDQoNCg0KYGBge3J9DQojIFZlcmlmaWNhdGlvbiBkJ3VuIHF1ZWxjb25xdWUgcmVzc2VtYmxhbmNlDQppZGVudGljYWwocHJlZGljdGlvbnMyLCBwcmVkaWN0aW9uczQpDQpgYGANCmBgYHtyfQ0KIyBWZXJpZmljYXRpb24gZCd1biBxdWVsY29ucXVlIHJlc3NlbWJsYW5jZQ0KaWRlbnRpY2FsKHByZWRpY3Rpb25zMSwgcHJlZGljdGlvbnMyKQ0KDQpgYGANCg0KYGBge3J9DQoNCmlkZW50aWNhbChwcmVkaWN0aW9uczMsIHByZWRpY3Rpb25zNCkNCg0KYGBgDQoNCg0K